<?php

define('ROOT_PATH', __DIR__);
include ROOT_PATH . '/IMooc/Loader.php';
spl_autoload_register('\\IMooc\\Loader::autoload');
//echo '<meta http-equiv="content-type" content="text/html;charset=utf-8" />';

/*
 * 测试自动加载 
 * 
  App\Controller\Home\Index::test();
  IMooc\Object::test();
 * 
 */


/*
 * 测试魔术方法
 *  
  $obj = new IMooc\Object();
  $obj->title = 'hello world';
  echo $obj->title;
  echo $obj->test('hello',123);
  echo IMooc\Object::test('hello1', 1234);
  echo $obj;
  echo $obj($obj);
 * 
 */


/*
 * 测试单例模式 
 * 
  $paginator = IMooc\Factory::createPaginator();
  $db1 = IMooc\Database::getInstance();
  $db2 = IMooc\Database::getInstance();
  var_dump($db1 === $db2);
 * 
 */


/*
 * 测试策略模式
 * 
  class Page {

  protected $strategy;

  function index()
  {
  echo 'AD:';
  $this->strategy->showAd();
  echo '<br />';
  echo 'Category:';
  $this->strategy->showCategory();
  }

  function setStrategy(\IMooc\UserStrategy $strategy)
  {
  $this->strategy = $strategy;
  }

  }

  $page = new Page();
  if (isset($_GET['female']))
  {
  $strategy = new \IMooc\FemaleUserStrategy();
  }
  else
  {
  $strategy = new \IMooc\MaleUserStrategy();
  }
  $page->setStrategy($strategy);
  $page->index();
 * 
 */

/*
 * 测试适配器模式 
 * 
  $db = new IMooc\Database\MySQL();
  $db->connect('127.0.0.1', 'root', '', 'design-patterns');
  $db->query('show databases');
  $db->close();
 * 
 */

/*
 * 测试数据对象映射模式 + 工厂模式 + 注册器模式 
 * 模拟场景,用index和test方法分别对User对象里的两个字段进行更新
 * 
 * class modifyUser {

  function modifyName($name)
  {

  //        $user = new IMooc\User(1);如果不使用工厂方法,则每用一次User对象,就得new一下,当User类改名或参数有变化时,每个new的地方都得更改
  $user = IMooc\Factory::getUser(1); //使用工厂方法生产出User类的一个对象
  //        var_dump($user);
  $user->name = $name;
  return $this;
  }

  function modifyMobile()
  {
  //        $user = new IMooc\User(1);
  $user = IMooc\Factory::getUser(1); //使用工厂方法生产出User类的一个对象
  //        var_dump($user);
  $user->mobile = $mobile;
  return $this;
  }

  }

  $modifyUser = new modifyUser();
  $modifyUser->modifyName('GCYangXiXi')->modifyMobile('13311112222');
 * 
 */

/*
 * 测试观察者模式(发布-订阅（Publish/Subscribe）模式、模型-视图（Model/View）模式、源-监听器（Source/Listener）模式或从属者（Dependents）模式)
 * 
 * 观察者模式: 当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新
 * 场景: 当一个事件发生后,要执行一连串更新操作,传统的编程方法,就是在事件的代码之后直接加入处理逻辑.当更新的逻辑增多之后,代码会变得难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码.
 * 观察者模式实现了低耦合,非侵入式的通知与更新机制.
 * 
 * class Event extends \IMooc\EventGenerator {

  //表示触发一个新的事件
  function trigger()
  {
  echo 'Event<br />'; //表示事件发生了
  //update,传统编程是在事件更新之后,直接写逻辑代码,当更新的逻辑代码越来越多时,代码就会越来越难以维护,而且,事件,以及事件发生之后的更新操作,全部是耦合在一起的,但实际上,事件及事件更新后的逻辑1,逻辑2,逻辑3,分别是不同的业务模块.还有,一旦业务逻辑需要更改时,就需要侵入到事件主体中修改,耦合度高
  //echo '逻辑1<br />';
  //echo '逻辑2<br />';
  //echo '逻辑3<br />';
  $this->notify();
  }

  }

  //观察者1
  class Observer1 implements \IMooc\Observer {

  function update($event_info = null)
  {
  echo '逻辑1<br />';
  }

  }

  class Observer2 implements \IMooc\Observer {

  function update($event_info = null)
  {
  echo '逻辑2<br />';
  }

  }

  class Observer3 implements \IMooc\Observer {

  function update($event_info = null)
  {
  echo '逻辑3<br />';
  }

  }

  $event = new Event;
  //为事件添加观察者1
  $event->addObserver(new Observer1);
  //为事件添加观察者2
  $event->addObserver(new Observer2());
  //为事件添加观察者3
  $event->addObserver(new Observer3());
  //事件发生
  $event->trigger();
 * 
 */

/*
 * 测试原型模式
 * 
 * 1.与工厂模式作用类似,都是用来创建对象;
 * 2.与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,然后通过clone原型对象来创建新得对象.这样就免去了类创建时重复的初始化操作;
 * 3.原型模式适用于大对象的创建.创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可.
 * 
 */

/*
  //不使用用原型模式时,每次绘画都需要进行初始化绘画画布,每次都要使用for循环循环200次,造成资源浪费
  $canvas1 = new IMooc\Canvas;
  $canvas1->init();
  $canvas1->rect(3, 6, 4, 12);
  $canvas1->draw();
  echo '<hr /><hr /><hr />';
  $canvas2 = new IMooc\Canvas;
  $canvas2->init();
  $canvas2->rect(4, 9, 7, 10);
  $canvas2->draw();

  //使用原型模式
  $prototype = new IMooc\Canvas;
  $prototype->init();
  //需要新对象时,就clone元对象
  $canvas3 = clone $prototype;
  $canvas3->rect(3, 6, 4, 12);
  $canvas3->draw();
  echo '<hr /><hr /><hr />';
  $canvas4 = clone $prototype;
  $canvas4->rect(4, 9, 7, 10);
  $canvas4->draw();
 */

/*
 * 测试装饰器模式
 * 
 * 1.装饰器模式(Decorator),可以动态的添加修改类的功能;
 * 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法;
 * 3,使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性.
 * 
 */

/*
  $canvas = new IMooc\Canvas;
  $canvas->init();
  //添加颜色装饰器
  $canvas->addDecorator(new \IMooc\ColorDrawDecorator('green'));
  //添加字体大小装饰器
  $canvas->addDecorator(new \IMooc\SizeDrawDecorator('18px'));
  $canvas->rect(3, 6, 4, 12);
  $canvas->draw();
 */

/*
 * 测试迭代器模式 
 * 
 * 1.迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素
 * 2.相比于传统的编程模式,迭代器模式可以隐藏遍历元素的所需的操作
 * 
 */

/*
  $users = new IMooc\AllUser;
  foreach ($users as $user)
  {
  var_dump($user);
  }
 */

/*
 * 测试代理模式
 * 
 */

/*
  $proxy = new \IMooc\Proxy();
  $proxy->getUsername($id);
  $proxy->setUsername($id, $proxy);
 */

/*
 * 测试加载配置项
 * 
 */

/*
  $config = new \IMooc\Config(__DIR__ . '/configs');
  var_dump($config['controller']);
 */

/*
 * 测试使用工厂方法获取数据库连接对象
 * 
 */
//$db = \IMooc\Factory::getDatabase();
IMooc\Application::getInstance(__DIR__)->dispatch();




